package com.thh.thymeleaf.service;


import com.thh.thymeleaf.pojo.Student;

import org.apache.commons.io.IOUtils;

import org.apache.commons.lang3.StringUtils;

import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import org.thymeleaf.templateresolver.StringTemplateResolver;

import java.io.IOException;
import java.io.InputStream;
import java.util.*;


@Service
public class PageService {




    //页面静态化方法
    /**
     * 静态化程序获取页面的DataUrl
     *
     * 静态化程序远程请求DataUrl获取数据模型。
     *
     * 静态化程序获取页面的模板信息
     *
     * 执行页面静态化
     */
    public String getPageHtml(String pageId){

        //获取数据模型
        Map model = getModelByPageId(pageId);
        if(model == null){
            //数据模型获取不到
            throw new RuntimeException("数据模型获取不到");
        }

        //获取页面的模板信息
        String template = getTemplate();
        if(StringUtils.isEmpty(template)){
            throw new RuntimeException("模板信息为null,无法生成");
        }

        //执行静态化
        String html = generateHtml(template, model);//实现resource里文件模板
       // String html = generateHtmlByStringTemplate(template, model);//实现字符串模板
        return html;

    }
    //执行静态化
    private String generateHtml(String templateContent,Map dataModel ) {

        System.out.println("templateContent"+templateContent);
        // 1.上下文,承载数据模型:就是我们模板页面需要的变量的值

        Context context = new Context();



        context.setVariables(dataModel);//数据模型设置到上下文里


        // 3.生成页面

        try {
          //创建模板解析器,可以在配置里面配置
          ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
          resolver.setTemplateMode(TemplateMode.HTML);//模板模型:指定模板类型是html
          resolver.setPrefix("templates/");//模板所在目录，相对于当前classloader的classpath。
          resolver.setSuffix(".html");//设置后缀,执行模板引擎就不要加后缀html了

            //使用模板引擎就可以生成页面
            TemplateEngine engine = new TemplateEngine();//创建模板引擎
            engine.setTemplateResolver(resolver);//设置模板解析器
            // 模板名称,     上下文, 文件的实例化对象
            // engine.process("test.html", context, writer);//执行模板引擎,根据test.html模板生成页面,context上下文,writer是PrintWriter对象
            String process = engine.process("test",context);
            return process;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }














    private String generateHtmlByStringTemplate(String templateContent,Map dataModel ) {

        System.out.println("templateContent"+templateContent);
        // 1.上下文,承载数据模型:就是我们模板页面需要的变量的值
        Context context = new Context();
        context.setVariables(dataModel);//数据模型设置到上下文里
        // 3.生成页面
        try {
            TemplateEngine engine = new TemplateEngine();//创建模板引擎
            String process = engine.process(templateContent,context);
            return process;

        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }







    //获取页面的模板信息
    private String getTemplate(){

        //模仿从mongdb数据库里拿文件数据

        ClassPathResource classPathResource = new ClassPathResource("templates/test.html");
        // File file = classPathResource.getFile();

            try (
                    InputStream inputStream     =   classPathResource.getInputStream();
                    ){

                String content = IOUtils.toString(inputStream, "utf-8");
                return content;
            } catch (IOException e) {
                e.printStackTrace();
            }

        return null;

    }

    //获取数据模型
    public Map getModelByPageId(String pageId){
        Map map = new HashMap();
        //向数据模型放数据
        map.put("name","测试员");
        Student stu1 = new Student();
        stu1.setName("小明");
        stu1.setAge(18);
        stu1.setMondy(1000.86f);
        stu1.setBirthday(new Date());
        Student stu2 = new Student();
        stu2.setName("小红");
        stu2.setMondy(200.1f);
        stu2.setAge(19);
        stu2.setBirthday(new Date());
        List<Student> friends = new ArrayList<>();
        friends.add(stu1);
        stu2.setFriends(friends);
        stu2.setBestFriend(stu1);
        List<Student> stus = new ArrayList<>();
        stus.add(stu1);
        stus.add(stu2);
        //向数据模型放数据
        map.put("stus",stus);
        //准备map数据
        HashMap<String,Student> stuMap = new HashMap<>();
        stuMap.put("stu1",stu1);
        stuMap.put("stu2",stu2);
        //向数据模型放数据
        map.put("stu1",stu1);
        //向数据模型放数据
        map.put("stuMap",stuMap);


        return map;

    }



}
